package fr.babos.graphic.components.controls.text
{
	import flash.events.FocusEvent;
	import flash.events.SoftKeyboardEvent;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFieldType;
	import flash.text.TextFormat;
	import fr.babos.graphic.components.controls.text.TextBase;
	
	/**
	 * @author ZoulouX
	 */
	public class InputText extends TextBase
	{
		/**
		 * Le texte à afficher par défaut
		 */
		protected var _placeHolderText						:String				= "";
		
		/**
		 * La couleur du texte par défaut (-1 pour aucun changement de couleur)
		 */
		protected var _placeHolderColor						:int				= -1;
		
		/**
		 * Le format normal du texte
		 */
		protected var _normalFormat							:TextFormat;
		
		/**
		 * Relayer les evènements softKeyboard sur le stage
		 */
		protected var _dispatchSoftKeyboardEvents			:Boolean			= true;
		
		/**
		 * Si c'est un mot de passe
		 */
		protected var _password								:Boolean			= false;
		
		
		/**
		 * Le texte à afficher par défaut
		 */
		public function get placeHolderText ():String { return _placeHolderText; }
		public function set placeHolderText (value:String):void
		{
			// Enregistrer le texte
			_placeHolderText = value;
		}
		
		/**
		 * La couleur du texte par défaut
		 */
		public function get placeHolderColor ():int { return _placeHolderColor; }
		public function set placeHolderColor (value:int):void
		{
			// Enregistrer la couleur
			_placeHolderColor = value;
		}
		
		/**
		 * La valeur du champs texte
		 */
		override public function get value ():String
		{
			if (_textField.text == _placeHolderText)
			{
				return "";
			}
			else
			{
				return _textField.text;
			}
		}
		override public function set value (value:String):void 
		{
			// Enregistrer le texte
			_textField.text = value;
			
			// Actualiser la taille
			resized();
		}
		
		/**
		 * Relayer les evènements softKeyboard sur le stage
		 */
		public function get dispatchSoftKeyboardEvents ():Boolean { return _dispatchSoftKeyboardEvents; }
		public function set dispatchSoftKeyboardEvents (value:Boolean):void 
		{
			_dispatchSoftKeyboardEvents = value;
		}
		
		/**
		 * Si c'est un mot de passe
		 */
		public function get password ():Boolean { return _password; }		
		public function set password (value:Boolean):void
		{
			_password = value;
			
			_textField.displayAsPassword = _password;
		}
		
		
		/**
		 * Le constructeur
		 */
		public function InputText ()
		{
			
		}
		
		
		/**
		 * Construire le textField
		 */
		override protected function buildTextField ():void
		{
			// Relayer
			super.buildTextField();
			
			// Pas de multiligne ni de taille automatique
			multiline = false;
			autoSize = false;
			
			// TextField en mode input
			_textField.type = TextFieldType.INPUT;
			
			// Ecouter le clavier virtuel
			//_textField.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE, softKeyboardEventHandler);
			//_textField.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATING, softKeyboardEventHandler);
			//_textField.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE, softKeyboardEventHandler);
			
			// Ecouter le focus
			_textField.addEventListener(FocusEvent.FOCUS_IN, focusHandler);
			_textField.addEventListener(FocusEvent.FOCUS_OUT, focusHandler);
		}
		
		override public function init ():void
		{
			textField.cacheAsBitmap = true;
		}
		
		/**
		 * Changement de focus
		 */
		protected function focusHandler (event:FocusEvent):void 
		{
			// Si on a un placeholder
			if (_placeHolderText != "")
			{
				// Si on active le focus et que le placeholder est affiché
				if (event.type == FocusEvent.FOCUS_IN && _textField.text == _placeHolderText)
				{
					// On vire le placeholder
					_textField.text = "";
					
					// Actualiser la couleur du placeHolder
					updatePlaceHolderColor();
				}
				
				// Si on désactive le focus et que le champs est vide
				else if (event.type == FocusEvent.FOCUS_OUT && _textField.text == "")
				{
					// on affiche le placeholder
					_textField.text = _placeHolderText;
					
					// Actualiser la couleur du placeHolder
					updatePlaceHolderColor();
				}
			}
		}
		
		/**
		 * Définir le format du texte
		 * @param	pFormat : Le format
		 * @param	pStart : -1 pour tout
		 * @param	pEnd : -1 pour tout
		 */
		override public function format (pFormat:TextFormat, pStart:int = -1, pEnd:int = -1):TextBase 
		{
			// Enregistrer le format pour la couleur du placeholder
			_normalFormat = pFormat;
			
			// Relayer
			return super.format(pFormat, pStart, pEnd);
		}
		
		/**
		 * Définir le texte affiché (pas d'HTML)
		 * @param	pValue : Le texte à afficher
		 */
		override public function text (pValue:String):TextBase
		{
			// Si on a un placeholder et qu'on n'a pas de texte
			if (pValue == "" && _placeHolderText != "")
			{
				// On affiche le placeholder
				super.text(_placeHolderText);
			}
			else
			{
				// Sinon on relais
				super.text(pValue);
			}
			
			// Actualiser la couleur du placeHolder
			updatePlaceHolderColor();
			
			// Méthode chaînable
			return this;
		}
		
		/**
		 * Actualiser la couleur du texte selon le placeholder
		 */
		protected function updatePlaceHolderColor ():void
		{
			// Si on a un placeholder et une couleur de placeholder
			if (_placeHolderColor != -1 && _placeHolderText != "" && _textField.text == _placeHolderText)
			{
				// On applique la couleur du placeholder
				_textField.textColor = _placeHolderColor;
				_textField.displayAsPassword = false;
			}
			else
			{
				// Appliquer la couleur du texte
				_textField.textColor = parseFloat(_normalFormat.color.toString());
				_textField.displayAsPassword = _password;
			}
		}
		
		/**
		 * Texte par défaut
		 * @param	pPlaceHolderText : Le texte par défaut
		 * @param	pPlaceHolderColor : La couleur du texte par défaut
		 */
		public function placeHolder (pPlaceHolderText:String, pPlaceHolderColor:int = -1):void
		{
			// Enregistrer
			_placeHolderText = pPlaceHolderText;
			_placeHolderColor = pPlaceHolderColor;
			
			// Si on n'a pas de texte on appliquer le placeHolder
			if (_textField.text == "")
				_textField.text = _placeHolderText;
			
			// Actualiser la couleur du placeHolder
			updatePlaceHolderColor();
		}
		
		
		/**
		 * Le clavier virtuel change d'état
		 */
		protected function softKeyboardEventHandler (event:SoftKeyboardEvent):void
		{
			// Si on a un stage
			if (stage != null && _dispatchSoftKeyboardEvents)
			{
				// On relais cet event sur le stage
				//stage.dispatchEvent(event);
			}
		}
		
		/**
		 * Le composant est redimensionné
		 */
		override protected function resized ():void 
		{
			// Relayer
			super.resized();
			
			// Appliquer les dimension
			_textField.width = _localWidth;
			_textField.height = _localHeight;
		}
		
		/**
		 * Destruction
		 */
		override public function dispose():void 
		{
			// Relayer
			super.dispose();
			
			// Ne plus écouters
			//_textField.removeEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE, softKeyboardEventHandler);
			//_textField.removeEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATING, softKeyboardEventHandler);
			//_textField.removeEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE, softKeyboardEventHandler);
			
			_textField.removeEventListener(FocusEvent.FOCUS_IN, focusHandler);
			_textField.removeEventListener(FocusEvent.FOCUS_OUT, focusHandler);
		}
	}
}